import {
	isObject,
	isArray
} from "./is";

export function merge(target, ...arg) {
	return arg.reduce((acc, cur) => {
		return Object.keys(cur).reduce((subAcc, key) => {
			const srcVal = cur[key]
			if (isObject(srcVal)) {
				subAcc[key] = merge(subAcc[key] ? subAcc[key] : {}, srcVal)
			} else if (isArray(srcVal)) {
				// series: []，下层数组直接赋值
				subAcc[key] = srcVal.map((item, idx) => {
					if (isObject(item)) {
						const curAccVal = subAcc[key] ? subAcc[key] : []
						return merge(curAccVal[idx] ? curAccVal[idx] : {}, item)
					} else {
						return item
					}
				})
			} else {
				subAcc[key] = srcVal
			}
			return subAcc
		}, acc)
	}, target)
}

// console.log(merge({}, {q: 1, series: [{a: 1, b: 2, data: [4]}]}, {a: 2, series: [{ a: 3, b: 4, data: [1, 2, 3] }] }))
//{ q: 1, series: [ { a: 3, b: 4, data: [1, 2, 3]} ], a: 2 }
